home *** CD-ROM | disk | FTP | other *** search
/ Gamers Delight 2 / Gamers Delight 2.iso / Aminet / game / role / DebugTool_111.lha / srcobject.c < prev    next >
C/C++ Source or Header  |  1993-05-06  |  7KB  |  329 lines

  1. #include "frobnitz.h"
  2.  
  3. int entry_length;
  4.  
  5. /*******************************************************************/
  6. /*  Funktion: ReadObjects                                          */
  7. /*******************************************************************/
  8.  
  9. void
  10. ReadObjects (void)
  11. {
  12.   unsigned long present_count, min_data, address;
  13.   z_word start_objs;
  14.  
  15.   present_count = start_objs = header.object_offset + (old_header ? NUM_PROPS_OLD : NUM_PROPS_NEW) * 2;
  16.  
  17.   entry_length = ((old_header) ? 9 : 14);
  18.  
  19.   seek_pos (start_objs);
  20.  
  21. #ifdef DEBUG
  22.   printf ("<RO-BEG:$%04x>\n", ftell (DatFile));
  23. #endif
  24.  
  25.   min_data = 0xffff;
  26.   objects_count = 0;
  27.  
  28.   while (present_count < min_data)
  29.     {
  30.       fread (object_table[objects_count], 1, entry_length, DatFile);
  31.  
  32.       address = (object_table[objects_count][entry_length - 2] * 256) + object_table[objects_count][entry_length - 1];
  33.  
  34.       if (address < min_data)
  35.     min_data = address;
  36.  
  37.       present_count = present_count + entry_length;
  38.       objects_count++;
  39.     }
  40.  
  41. #ifdef DEBUG
  42.   printf ("<RO-END:$%04x>\n", ftell (DatFile));
  43. #endif
  44.  
  45.   objects_read = 1;
  46. }
  47.  
  48. /*******************************************************************/
  49. /*  Funktion: PrintObjects                                         */
  50. /*******************************************************************/
  51.  
  52. void
  53. PrintObjects (void)
  54. {
  55.   int i, j, k;
  56.   byte first;
  57.  
  58.   printf ("OBJECTS:\n\n");
  59.  
  60.   if (!objects_read)
  61.     ReadObjects ();
  62.  
  63.   if (!no_props)
  64.     PrintDefProperties ();
  65.  
  66.   printf ("%d objects:\n", objects_count);
  67.  
  68.   for (i = 0; i < objects_count; i++)
  69.     {
  70.       PrintObject (i);
  71.  
  72.       newline ();
  73.  
  74.       if (!no_attr)
  75.     {
  76.       printf ("\tParent: ");
  77.       if (dec_enum)
  78.         printf ("%d", ((old_header) ? object_table[i][4] : ((object_table[i][6] * 256) + object_table[i][7])));
  79.       else
  80.         printf ("$%3x", ((old_header) ? object_table[i][4] : ((object_table[i][6] * 256) + object_table[i][7])));
  81.  
  82.       printf ("   Sibling: ");
  83.       if (dec_enum)
  84.         printf ("%d", ((old_header) ? object_table[i][5] : ((object_table[i][8] * 256) + object_table[i][9])));
  85.       else
  86.         printf ("$%3x", ((old_header) ? object_table[i][5] : ((object_table[i][8] * 256) + object_table[i][9])));
  87.  
  88.       printf ("   Child: ");
  89.       if (dec_enum)
  90.         printf ("%d", ((old_header) ? object_table[i][6] : ((object_table[i][10] * 256) + object_table[i][11])));
  91.       else
  92.         printf ("$%3x", ((old_header) ? object_table[i][6] : ((object_table[i][10] * 256) + object_table[i][11])));
  93.  
  94.       newline ();
  95.  
  96.       printf ("\tAttribs: ");
  97.       first = 1;
  98.       for (j = 0; j < ((old_header) ? 4 : 6); j++)
  99.         {
  100.           for (k = 7; k >= 0; k--)
  101.         {
  102.           if ((object_table[i][j] >> k) & 1)
  103.             {
  104.               printf ("%c%d", (first ? '(' : ','), ((7 - k) + (j * 8)));
  105.               first = 0;
  106.             }
  107.         }
  108.         }
  109.       printf ("%s", (first ? "" : ")"));
  110.       newline ();
  111.     }
  112.  
  113.       if (!no_props)
  114.     PrintProperties (i);
  115.  
  116.       if ((!no_attr) || (!no_props))
  117.     newline ();
  118.     }
  119. }
  120.  
  121. /*****************************************************************/
  122. /*     FUNKTION: PrintObject                                     */
  123. /*****************************************************************/
  124.  
  125. void
  126. PrintObject (int l)
  127. {
  128.   int name_length;
  129.   z_word pos;
  130.   long int twobytes;
  131.   byte is_end;
  132.   int j, k;
  133.   unsigned char buffer[MAXLEN_OBJECT * 2];
  134.  
  135.   if (!objects_read)
  136.     ReadObjects ();
  137.  
  138.   pos = (object_table[l][entry_length - 2] * 256) + object_table[l][entry_length - 1];
  139.  
  140.   seek_pos (pos);
  141.  
  142.   name_length = fgetc (DatFile);
  143.   if (name_length > (MAXLEN_OBJECT - 1))
  144.     quit (5);
  145.   fread (buffer, 1, (name_length * 2), DatFile);
  146.  
  147.   for (j = 0; j < (name_length * 2); j = j + 2)
  148.     {
  149.       is_end = ((twobytes = (256 * buffer[j]) + buffer[j + 1]) > 0x7fff);
  150.  
  151.       k = ((j / 2) * 3) + 1;
  152.  
  153.       EncodedString[k] = (twobytes & 0x7c00) / 0x400;
  154.       EncodedString[k + 1] = (twobytes & 0x3e0) / 0x20;
  155.       EncodedString[k + 2] = (twobytes & 0x1f);
  156.     }
  157.  
  158.   EncodedString[0] = ((name_length) ? (k + 2) : 0);
  159.   EncodedString[k + 3] = '\0';
  160.  
  161.   if (!no_enum)
  162.     if (dec_enum)
  163.       printf ("%4d : %s", l + 1, (((is_end) && (name_length)) ? "" : "[]"));
  164.     else
  165.       printf ("$%3x : %s", l + 1, (((is_end) && (name_length)) ? "" : "[]"));
  166.   else
  167.     printf ("%s", (((is_end) && (name_length)) ? "" : "[]"));
  168.  
  169.   StringDecode ();
  170.  
  171.   printf ("%s", DecodedString);
  172. }
  173.  
  174.  
  175. /*****************************************************************/
  176. /*     FUNKTION: PrintDefProperties                              */
  177. /*****************************************************************/
  178.  
  179. void
  180. PrintDefProperties (void)
  181. {
  182.   unsigned short int i;
  183.   z_word pos;
  184.  
  185.   if (!objects_read)
  186.     ReadObjects ();
  187.   printf ("%d properties:\n", (old_header ? NUM_PROPS_OLD : NUM_PROPS_NEW));
  188.  
  189.   pos = header.object_offset;
  190.  
  191.   seek_pos (pos);
  192.  
  193. #ifdef DEBUG
  194.   printf ("<PRD-BEG:$%04x>\n", ftell (DatFile));
  195. #endif
  196.  
  197.   for (i = 1; i <= (old_header ? NUM_PROPS_OLD : NUM_PROPS_NEW); i++)
  198.     {
  199.       printf ("[%2d]  %02x", i, fgetc (DatFile));
  200.       printf (" %02x\n", fgetc (DatFile));
  201.     }
  202.  
  203. #ifdef DEBUG
  204.   printf ("<PRD-END:$%04x>\n", ftell (DatFile));
  205. #endif
  206.  
  207.   newline ();
  208. }
  209.  
  210.  
  211. /*****************************************************************/
  212. /*     FUNKTION: PrintProperties                                 */
  213. /*****************************************************************/
  214.  
  215. void
  216. PrintProperties (int l)
  217. {
  218.   unsigned short int jump, index, size, id;
  219.   z_word pos;
  220.   unsigned short int i;
  221.   unsigned short int ind_block_num, size1, index2, ignored2, ignored3,
  222.    size2;
  223. #ifdef DEBUG
  224.   z_word next;
  225.   unsigned short int j;
  226. #endif
  227.  
  228.   if (!objects_read)
  229.     ReadObjects ();
  230.  
  231.   pos = (object_table[l][entry_length - 2] * 256) + object_table[l][entry_length - 1];
  232.  
  233.   seek_pos (pos);
  234.  
  235. #ifdef DEBUG
  236.   printf ("<PR-BEG:$%04x>\n", ftell (DatFile));
  237. #endif
  238.  
  239.   printf ("\tProps:  ");
  240.  
  241.   jump = fgetc (DatFile) * 2;
  242.   for (i = 0; i < jump; i++)
  243.     fgetc (DatFile);
  244.  
  245.   index = fgetc (DatFile);
  246.  
  247.   if (index == 0)
  248.     newline ();
  249.  
  250.   if (old_header)
  251.     {
  252.       while (index != 0)
  253.     {
  254.       size = (index >> 5) + 1;
  255.       id = (index & 0x1f);
  256.  
  257.       printf (" [%2d] ", id);
  258.       for (i = 0; i < size; i++)
  259.         printf (" %02x", fgetc (DatFile));
  260.       newline ();
  261.  
  262.       index = fgetc (DatFile);
  263.       if (index != 0)
  264.         printf ("\t        ");
  265.     }
  266.     }
  267.   else
  268.     {
  269.       while (index != 0)
  270.     {
  271.       ind_block_num = (index >> 7) + 1;
  272.       size = size1 = ((index >> 6) & 1) + 1;
  273.       id = (index & 0x3f);
  274.  
  275.       if (ind_block_num == 2)
  276.         {
  277. #ifdef DEBUG
  278.           if (size == 2)
  279.         printf ("ALERT! size1 = 1\n\t        ");
  280. #endif
  281.           index2 = fgetc (DatFile);
  282.  
  283.           ignored2 = (index2 >> 7);
  284.           ignored3 = (index2 >> 6) & 1;
  285.           size = size2 = (index2 & 0x3f);
  286.  
  287. #ifdef DEBUG
  288.           if (ignored2 == 0)
  289.         printf ("ALERT! i2 = 0\n\t        ");
  290.           if (ignored3 == 0)
  291.         printf ("ALERT! i3 = 0\n\t        ");
  292. #endif
  293.         }
  294.  
  295.       printf (" [%2d] ", id);
  296.  
  297.       for (i = 0; i < size; i++)
  298.         printf (" %02x", fgetc (DatFile));
  299.       newline ();
  300.  
  301.       index = fgetc (DatFile);
  302.  
  303.       if (index != 0)
  304.         printf ("\t        ");
  305.     }
  306.     }
  307.  
  308. #ifdef DEBUG
  309.   pos = ftell (DatFile);
  310.   printf ("<PR-END:$%04x>\n", pos);
  311.  
  312.   next = 0;
  313.   for (j = 0; j < objects_count; j++)
  314.     {
  315.       if (pos == (object_table[j][entry_length - 2] * 256) + object_table[j][entry_length - 1])
  316.     next = j + 1;
  317.     }
  318.  
  319.   printf ("Next proplist: ");
  320.   if (next != 0)
  321.     {
  322.       printf ("$%3x", next);
  323.     }
  324.   else
  325.     printf ("NONE");
  326.   newline ();
  327. #endif
  328. }
  329.